package com.example.springmvc;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/request2")
public class Request2Controller {
    /**
     * 获取 Cookie
     * @param request HttpServletRequest是SpringMVC的内置对象，需要时直接在方法中添加声明即可
     *                http请求里有什么，这个对象就有什么
     */
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie cookie : cookies){
                System.out.println(cookie.getName() + "=" + cookie.getValue());
            }
        }
        return "获取 Cookie 成功";
    }

    @RequestMapping("/getCookie2")
    public String getCookie(@CookieValue("bite") String bite){
        return "获取 Cookie 成功, bite = " + bite;
    }

    /**
     * 获取 Session. Session是服务端机制，需要先设置，再获取
     * @param request
     */
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        // 1. 当用户登陆的时候,服务器在 Session 中新增一个新记录,并把 sessionId 返回给客户端.(通过 HTTP 响应中的 Set-Cookie 字段返回).
        // 2. 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的 Cookie 字段带上).
        // 3. 服务器收到请求之后,根据请求中的 sessionId 在 Session 信息中获取到对应的用户信息, 再进行后续操作. 找不到则重新创建Session, 并把SessionID返回
        /* 这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的 Cookie 里的 SessionId,
        然后根据 SessionId 获取到对应的 Session 对象, Session 对象用 HttpSession 来描述 */
        // 获取 Session
        /* true:未获取到 Session 对象，则创建一个. false:未获取到 Session 对象，则返回 null.
        getSession() 和 getSession(true) 含义⼀样, 默认值为true. */
        HttpSession session = request.getSession();
        session.setAttribute("name","zhangsan");
        session.setAttribute("age",18);
        session.setAttribute("userInfo",new Person("lisi",1,18));
        return "设置 Session 成功";
    }

    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession(false); // 获取 Session
        if(session != null){
            System.out.println("name: " + session.getAttribute("name"));
            System.out.println("userInfo: " + session.getAttribute("userInfo"));
        }
        return "获取 Session 成功, name:" + session.getAttribute("name");
    }

    @RequestMapping("/getSession2")
    public String getSession(@SessionAttribute("name") String name){
        return "获取 Session 成功, name:" + name;
    }

    @RequestMapping("/getSession3")
    public String getSession(HttpSession session){
        return "获取 Session 成功, name:" + session.getAttribute("name");
    }

    /**
     * 获取 Header
     * @param request
     */
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");
        return "userAgent:" + userAgent;
    }

    @RequestMapping("/getHeader2")
    public String getHeader(@RequestHeader("User-Agent") String userAgent){
        return "userAgent:" + userAgent;
    }

}
